package com.atguigu.team.service;
import com.atguigu.team.domain.Architect;
import com.atguigu.team.domain.Designer;
import com.atguigu.team.domain.Employee;
/**
 * 
* @Description 关于开发团队成员的管理；添加 删除 查找 等
* @author yihu Email:1057202547@qq.com
* @version
* @date 2020年11月27日上午11:14:45
*
 */
import com.atguigu.team.domain.Programmer;

public class TeamService {
	
	//给memberID赋值使用
	private static int counter = 1;
	//开发团队最大人数
	private final  int MAX_TEAM = 5;
	
	//保存开发团队人员
	private Programmer[] teamProgrammers = new Programmer[MAX_TEAM];
	//记录开发团队红的实际人数
	private int toatal;
	
	public TeamService() {
		super();
	}
	/**
	 * 
	* @Description 获取开发团队的所有成员
	* @author yihu Email:1057202547@qq.com
	* @date 2020年11月27日下午2:41:03
	* @return
	 */
	public Programmer[] getTeam() {
		
		Programmer[] _teams = new Programmer[toatal];
		
		for (int i = 0; i < toatal; i++) {
			_teams[i] = this.teamProgrammers[i];
		}
		
		return _teams;
		
	}
	/**
	 * 
	* @Description 将指定成员添加
	* @author yihu Email:1057202547@qq.com
	* @date 2020年11月27日下午2:42:32
	* @param
	 */
	public void addMember(Employee employee) throws TeamException{
		
		//成员已满无法添加
		if(toatal >=  MAX_TEAM) {
			throw new TeamException("开发人员已满，无法在添加");
		}
		//该成员不是程序员
		if(!(employee instanceof Programmer)) {
			throw new TeamException("该成员不是程序员，无法添加");
		}
		
		Programmer programmer = (Programmer) employee;
		
		//该成员已在团队中
		if(isExist(programmer)) {
			throw new TeamException("该成员已在团队中，无法添加");
		}
		
		//该员工已经是某团队成员了
//		if("BUSY".equals(programmer.getStatus().getNAME())) {
//			throw new TeamException("该成员已是某团队成员，无法添加");
//		}else if ("VOCATION".equals(programmer.getStatus().getNAME())) {
//			throw new TeamException("该成员已正在休假，无法添加");
//		}
		switch (programmer.getStatus()){
			case BUSY:
				throw new TeamException("该成员已是某团队成员，无法添加");
			case VOCATION:
				throw new TeamException("该成员已正在休假，无法添加");
		}
		
		//获取team 中架构师 设计师 程序员的数量
		int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;
		
		for (int i = 0; i < teamProgrammers.length; i++) {
			if (teamProgrammers[i] instanceof Architect) numOfArch++;
            else if (teamProgrammers[i] instanceof Designer) numOfDsgn++;
            else if (teamProgrammers[i] instanceof Programmer) numOfPrg++;
		}
		
		if(programmer instanceof Architect) {
			if(numOfArch >=1) throw new TeamException("团队中至多只能有一名架构师");
		}else if(programmer instanceof Designer){
			if(numOfDsgn >=2) throw new TeamException("团队中至多只能有2名设计师");
		}else if (programmer instanceof Programmer){
			if(numOfPrg >=3) throw new TeamException("团队中至多只能有3名程序员"); 
		}
		
		//将员工添加到现有的team中
		teamProgrammers[toatal ++ ] = programmer;
		//将他的属性该过来
		programmer.setStatus(Status.BUSY);
		programmer.setMemberId(counter ++ );
		
	}
	
	/**
	 * 
	* @Description 判断该员工是否已存在
	* @author yihu Email:1057202547@qq.com
	* @date 2020年11月27日下午2:56:33
	* @param programmer
	* @return
	 */
	private boolean isExist(Programmer programmer) {
		for (int i = 0; i < toatal; i++) {
			if(teamProgrammers[i].getId() == programmer.getId()) {
				return true;
			}
		}
		return false;
	}
	/**
	 * 
	* @Description 从团队中删除成员
	* @author yihu Email:1057202547@qq.com
	* @date 2020年11月28日下午3:09:08
	 */
	public void removeMember(int memberId) throws TeamException{
		int i = 0;
		for (; i < toatal; i++) {
			if(teamProgrammers[i].getId() == memberId) {
				teamProgrammers[i].setStatus(Status.FREE);
				break;
			}
		}
		
		//未找到
		if(i== toatal) {
			throw new TeamException("未找到指定团队成员");
		}
		
		//将当前要删除的员工位置 后面的员工，往前覆盖  (最后一位清空)
		for (int j = i + 1; j < toatal; j++) {
			teamProgrammers[j - 1] = teamProgrammers[j];
		}
		teamProgrammers[--toatal] = null;
		
	}
	
}


